package com.wanghua.spring.listeners;

import javax.servlet.*;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.text.MessageFormat;

/*
* 监听 session、context、request 对象的属性变化。
* 对应的接口为：HttpSessionAttributeListener,ServletContextAttributeListener,ServletRequestAttributeListener。
* 当向被监听对象中添加、更新、移除属性时，会分别执行 xxxAdded()、xxxReplaced()、xxxRemoved() 方法。
* 此 AttributeListenerTest 类需要配置到 web.xml 中。
* */
public class AttributeListenerTest implements HttpSessionAttributeListener,ServletContextAttributeListener,ServletRequestAttributeListener {
	Log log = LogFactory.getLog(getClass());

	/* 1.session。可在 Action 中添加下面代码来测试；
	   ServletActionContext.getRequest().getSession().setAttribute("myKey","aa");
	   ServletActionContext.getRequest().getSession().setAttribute("myKey","bb");
	   ServletActionContext.getRequest().getSession().removeAttribute("myKey");
	*/
	@Override
	public void attributeAdded(HttpSessionBindingEvent se) {
		HttpSession session = se.getSession();  //发生变化的 Session
		log.info(MessageFormat.format("新建 session 属性：{0}, 值为：{1}", se.getName(), se.getValue()));
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent se) {
		HttpSession session = se.getSession();  //发生变化的 Session
		log.info(MessageFormat.format("删除 session 属性：{0}, 值为：{1}", se.getName(), se.getValue()));
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent se) {
		HttpSession session = se.getSession();  //发生变化的 Session
		String name = se.getName();   //属性名
		log.info(MessageFormat.format("修改 session 属性：{0}, 原值：{1}, 新值：{2}", name, se.getValue(), session.getAttribute(name)));
	}

	/* 2.context。可在 Action 中添加下面代码来测试；
       ServletActionContext.getServletContext().setAttribute("myKey","aa");
       ServletActionContext.getServletContext().setAttribute("myKey","bb");
       ServletActionContext.getServletContext().removeAttribute("myKey");
    */
	@Override
	public void attributeAdded(ServletContextAttributeEvent se) {
		ServletContext context = se.getServletContext();  //发生变化的 context
		log.info(MessageFormat.format("新建 context 属性：{0}, 值为：{1}", se.getName(), se.getValue()));
	}

	@Override
	public void attributeRemoved(ServletContextAttributeEvent se) {
		ServletContext context = se.getServletContext();  //发生变化的 context
		log.info(MessageFormat.format("删除 context 属性：{0}, 值为：{1}", se.getName(), se.getValue()));
	}

	@Override
	public void attributeReplaced(ServletContextAttributeEvent se) {
		ServletContext context = se.getServletContext();  //发生变化的 context
		String name = se.getName();   //属性名
		log.info(MessageFormat.format("修改 context 属性：{0}, 原值：{1}, 新值：{2}", name, se.getValue(), context.getAttribute(name)));
	}

	/* 3.request。可在 Action 中添加下面代码来测试；
       ServletActionContext.getRequest().setAttribute("myKey","aa");
       ServletActionContext.getRequest().setAttribute("myKey","bb");
       ServletActionContext.getRequest().removeAttribute("myKey");
        */
	@Override
	public void attributeAdded(ServletRequestAttributeEvent se) {
		ServletRequest request = se.getServletRequest();  //发生变化的 request
		log.info(MessageFormat.format("新建 request 属性：{0}, 值为：{1}", se.getName(), se.getValue()));
	}

	@Override
	public void attributeRemoved(ServletRequestAttributeEvent se) {
		ServletRequest request = se.getServletRequest();  //发生变化的 request
		log.info(MessageFormat.format("删除 request 属性：{0}, 值为：{1}", se.getName(), se.getValue()));
	}

	@Override
	public void attributeReplaced(ServletRequestAttributeEvent se) {
		ServletRequest request = se.getServletRequest();  //发生变化的 request
		String name = se.getName();   //属性名
		log.info(MessageFormat.format("修改 request 属性：{0}, 原值：{1}, 新值：{2}", name, se.getValue(), request.getAttribute(name)));
	}
}
